package com.slt.android.andfixdemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

import static android.R.attr.path;
import static android.content.ContentValues.TAG;
import static com.slt.android.andfixdemo.MyApplication.mPatchManager;

/**
 * AndFix是针对方法级的
 * 不能增加成员变量、成员方法、类
 * 具体方案的选取可以百度
 *
 * AndFix原理:
 * 1.使用虚拟机的jarFile加载的补丁文件，读取PATCH.MF文件得到补丁类名称 -- 加载补丁文件
 * 2.使用dexFile读取patch文件中的dex文件，获取后根据注解 获取到补丁方法 -- 获取补丁方法
 * 3.根据注解中获取到的类和方法名，使用classloader获取到class，然后根据反射得到bugmethod -- 获取bug方法
 * 4.使用c++中的指针替换bug方法对象的属性来修复bug -- jni层替换方法
 *
 * loadPatch可以放到application中，addPatch可以放到MainActivity中
 * 因为实际开发中需要尽快的请求网络获得差分包，然后再后面需要用上的时候，已经下载完成。
 * 
 * 把阿里的工具下载下来之后，把new.apk和old.apk mykey.jks一起copy到\tools\apkpatch-1.0.3目录下
 * 使用如下命令 apkpatch -f new.apk -t old.apk -o out -k mykey.jks -p android -a data -e android
 * 生成apatch文件，再重命名为fix.apatch，拷贝到sd卡根目录上(实际项目中可以下载到指定位置)
 *
 * 注意事项:
 * 1.需要加固的话，要在加固之前生成fix。patch
 * 2.混淆规则 https://github.com/alibaba/AndFix
 * 3.实际开发中还需要考虑持续更新时会遇到的问题
 * 4.这里sd卡根目录的fix.apatch加载之后，会复制到另外的目录getFilesDir目录下
 * 5.要持续更新的话需要删除吧？？
 *
 */
public class MainActivity extends Activity implements View.OnClickListener {
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn= (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
        fetchPatch();
    }

    private void fetchPatch() {
        // .apatch file path ，这里一定要注意每台手机sd卡路径不同
        File fixFile = new File(Environment.getExternalStorageDirectory(), "fix.apatch");
        if (fixFile.exists()) {
            //fixFile文件存在 则添加patch
            try {
                mPatchManager.addPatch(fixFile.getAbsolutePath());
            } catch (IOException e) {
                e.printStackTrace();
            }
            Log.d(TAG, "apatch:" + path + " added.");
        } else {
            //fixFile文件不存在 不操作
        }
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(this , "value == lololo " + 10086 ,Toast.LENGTH_SHORT).show();
    }
}
